import { AxiosProgressEvent } from 'axios';

import { request } from '@/utils/request/axios';
import { AjaxResult, ErrorMessageMode, PageData, PageRequest } from '#/request';

import { AppOutputDtoSimple, AppPackageResultDto, UpgradeCheckDto } from './model';

/** 移动端URL枚举 */
enum Api {
  /** 读取移动端应用 */
  ReadApp = '/api/mobile/readApp',
  /** 获取移动端应用 */
  GetApp = '/api/mobile/getApp',
  /** 获取所有移动端应用 */
  GetApps = '/api/mobile/getApps',

  /** 获取应用程序 */
  GetPackages = '/api/mobile/getPackages',

  /** 升级检测 */
  CheckUpgrade = '/api/mobile/checkUpgrade',

  /** 应用程序下载 */
  Download = '/api/mobile/download',
}

// #region 读取移动端应用
/**
 * 读取移动端应用
 * @param params 分页请求
 * @param mode 错误消息模型
 */
export function readApp(params: PageRequest, mode: ErrorMessageMode = 'message') {
  return request.post<PageData<AppOutputDtoSimple>>(
    {
      url: Api.ReadApp,
      params: params,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 获取移动端应用
/**
 * 获取移动端应用
 * @param id 移动端应用编号
 * @param mode 错误消息模型
 */
export function getApp(id: string | bigint, mode: ErrorMessageMode = 'message') {
  return request.get<AppOutputDtoSimple>(
    {
      url: Api.GetApp,
      params: { id },
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 获取所有移动端应用
/**
 * 获取所有移动端应用
 * @param mode 错误消息模型
 */
export function getApps(mode: ErrorMessageMode = 'message') {
  return request.get<AppOutputDtoSimple[]>(
    {
      url: Api.GetApps,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion

// #region 获取应用程序
/**
 * 获取应用程序
 * @param mode 错误消息模型
 */
export function getPackages(mode: ErrorMessageMode = 'message') {
  return request.get<AjaxResult<AppPackageResultDto[]>>(
    {
      url: Api.GetPackages,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion

// #region 升级检测
/**
 * 升级检测
 * @param dto DTO
 * @param mode 错误消息模型
 */
export function checkUpgrade(dto: UpgradeCheckDto, mode: ErrorMessageMode = 'message') {
  return request.post<AjaxResult<AppPackageResultDto>>(
    {
      url: Api.CheckUpgrade,
      params: dto,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion

// #region 应用程序下载
/**
 * 应用程序下载
 * @param packageId 应用程序包编号
 * @param mode 错误消息模型
 */
export function download(
  packageId: string | bigint,
  onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void,
  mode: ErrorMessageMode = 'message',
) {
  return request.downloadFile(
    {
      url: Api.Download,
      params: { packageId },
      onDownloadProgress,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
